<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

                    <h4>切片</h4>
                    <div class="x-wiki-info"><span>2384次阅读</span></div>
                    <hr style="border-top-color:#ccc" />
                    <div class="x-wiki-content x-content"><p>取一个list或tuple的部分元素是非常常见的操作。比如，一个list如下：</p>
<pre><code>&gt;&gt;&gt; L = [&#39;Michael&#39;, &#39;Sarah&#39;, &#39;Tracy&#39;, &#39;Bob&#39;, &#39;Jack&#39;]
</code></pre><p>取前3个元素，应该怎么做？</p>
<p>笨办法：</p>
<pre><code>&gt;&gt;&gt; [L[0], L[1], L[2]]
[&#39;Michael&#39;, &#39;Sarah&#39;, &#39;Tracy&#39;]
</code></pre><p>之所以是笨办法是因为扩展一下，取前N个元素就没辙了。</p>
<p>取前N个元素，也就是索引为0-(N-1)的元素，可以用循环：</p>
<pre><code>&gt;&gt;&gt; r = []
&gt;&gt;&gt; n = 3
&gt;&gt;&gt; for i in range(n):
...     r.append(L[i])
... 
&gt;&gt;&gt; r
[&#39;Michael&#39;, &#39;Sarah&#39;, &#39;Tracy&#39;]
</code></pre><p>对这种经常取指定索引范围的操作，用循环十分繁琐，因此，Python提供了切片（Slice）操作符，能大大简化这种操作。</p>
<p>对应上面的问题，取前3个元素，用一行代码就可以完成切片：</p>
<pre><code>&gt;&gt;&gt; L[0:3]
[&#39;Michael&#39;, &#39;Sarah&#39;, &#39;Tracy&#39;]
</code></pre><p><code>L[0:3]</code>表示，从索引0开始取，直到索引3为止，但不包括索引3。即索引0，1，2，正好是3个元素。</p>
<p>如果第一个索引是0，还可以省略：</p>
<pre><code>&gt;&gt;&gt; L[:3]
[&#39;Michael&#39;, &#39;Sarah&#39;, &#39;Tracy&#39;]
</code></pre><p>也可以从索引1开始，取出2个元素出来：</p>
<pre><code>&gt;&gt;&gt; L[1:3]
[&#39;Sarah&#39;, &#39;Tracy&#39;]
</code></pre><p>类似的，既然Python支持<code>L[-1]</code>取倒数第一个元素，那么它同样支持倒数切片，试试：</p>
<pre><code>&gt;&gt;&gt; L[-2:]
[&#39;Bob&#39;, &#39;Jack&#39;]
&gt;&gt;&gt; L[-2:-1]
[&#39;Bob&#39;]
</code></pre><p>记住倒数第一个元素的索引是<code>-1</code>。</p>
<p>切片操作十分有用。我们先创建一个0-99的数列：</p>
<pre><code>&gt;&gt;&gt; L = range(100)
&gt;&gt;&gt; L
[0, 1, 2, 3, ..., 99]
</code></pre><p>可以通过切片轻松取出某一段数列。比如前10个数：</p>
<pre><code>&gt;&gt;&gt; L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
</code></pre><p>后10个数：</p>
<pre><code>&gt;&gt;&gt; L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
</code></pre><p>前11-20个数：</p>
<pre><code>&gt;&gt;&gt; L[10:20]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
</code></pre><p>前10个数，每两个取一个：</p>
<pre><code>&gt;&gt;&gt; L[:10:2]
[0, 2, 4, 6, 8]
</code></pre><p>所有数，每5个取一个：</p>
<pre><code>&gt;&gt;&gt; L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
</code></pre><p>甚至什么都不写，只写<code>[:]</code>就可以原样复制一个list：</p>
<pre><code>&gt;&gt;&gt; L[:]
[0, 1, 2, 3, ..., 99]
</code></pre><p>tuple也是一种list，唯一区别是tuple不可变。因此，tuple也可以用切片操作，只是操作的结果仍是tuple：</p>
<pre><code>&gt;&gt;&gt; (0, 1, 2, 3, 4, 5)[:3]
(0, 1, 2)
</code></pre><p>字符串<code>&#39;xxx&#39;</code>或Unicode字符串<code>u&#39;xxx&#39;</code>也可以看成是一种list，每个元素就是一个字符。因此，字符串也可以用切片操作，只是操作结果仍是字符串：</p>
<pre><code>&gt;&gt;&gt; &#39;ABCDEFG&#39;[:3]
&#39;ABC&#39;
&gt;&gt;&gt; &#39;ABCDEFG&#39;[::2]
&#39;ACEG&#39;
</code></pre><p>在很多编程语言中，针对字符串提供了很多各种截取函数，其实目的就是对字符串切片。Python没有针对字符串的截取函数，只需要切片一个操作就可以完成，非常简单。</p>
<h3 id="-">小结</h3>
<p>有了切片操作，很多地方循环就不再需要了。Python的切片非常灵活，一行代码就可以实现很多行循环才能完成的操作。</p>
</div>

                    <hr style="border-top-color:#ccc" />

                    